/*
2．成绩排名次（结构体数组）
某班期末考试科目为数学（MT）、英语（EN）和物理（PH），有最多不超过30人参加考试。考试后要求：
（1）计算每个学生的总分和平均分；
（2）按总分成绩由高到低排出成绩的名次；
（3）打印出名次表，表格内包括学生编号、各科分数、总分和平均分；
（4）任意输入一个学号，能够查找出该学生在班级中的排名及其考试分数。
*/
#include<stdio.h>
struct student
{
    char name[8];
	int number;
	int MT,EN,PH,SUM,AVE;
};
int main()
{
	struct student st[30],temp;
	int i,j,n;
	double aveMT,aveEN,avePH;
	double sumMT,sumEN,sumPH;
	printf("期末考试统计\n");

	do
	{
		printf("请输入考试人数n(1<=n<=30)。\n");
		printf("n=");
		scanf("%d",&n);
		if(n<1||n>30)printf("输入错误\n");
	}while(n<1||n>30);

	for(i=0;i<n;i++)
	{
		printf("第%d学生的学号：",i+1);
		scanf("%d",&st[i].number);
		printf("姓名：");
		scanf("%s",st[i].name);
		printf("数学成绩：");
		scanf("%d",&st[i].MT);
		printf("英语成绩：");
		scanf("%d",&st[i].EN);
		printf("物理成绩：");
		scanf("%d",&st[i].PH);
		st[i].SUM=st[i].MT + st[i].EN + st[i].PH;
		st[i].AVE=st[i].SUM/3;
	}

	for(sumMT=0,i=0;i<n;i++)
	{
		sumMT+=st[i].MT;
	}
	aveMT=sumMT/n;
	for(sumEN=0,i=0;i<n;i++)
	{
		sumEN+=st[i].EN;
	}
	aveEN=sumEN/n;
	for(sumPH=0,i=0;i<n;i++)
	{
		sumPH+=st[i].PH;
	}
	avePH=sumPH/n;

	for(i=0;i<n-1;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(st[i].SUM<st[j].SUM)
			{
				temp=st[i];
				st[i]=st[j];
				st[j]=temp;
			}
		}
	}
	printf("\n名次表\n");
	printf("学号      名字      数学(MT)   英语(EN)   物理(PH)   ave      sum\n");
	for(i=0;i<n;i++)
	printf("%-10d%-10s%-11d%-11d%-11d%-9d%-9d \n",st[i].number,&st[i].name,st[i].MT,st[i].EN,st[i].PH,st[i].AVE,st[i].SUM);
	printf("各科平均分：        %-11.2lf%-11.2lf%-11.2lf \n",aveMT,aveEN,avePH);
    
    printf("\n成绩查询\n");
	do
	{
		printf("请输入学号：");
		scanf("%d",&num);
		printf("学号      名字      数学(MT)   英语(EN)   物理(PH)   ave      sum\n");
		for(i=0;i<n;i++)
		{
			if(num==st[i].number)printf("%-10d%-10s%-11d%-11d%-11d%-9d%-9d \n",st[i].number,&st[i].name,st[i].MT,st[i].EN,st[i].PH,st[i].AVE,st[i].SUM);
		}
	}while(1);
	return 0;
}